package utils
import chisel3._
import chisel3.util._

object PipelineConnect {
  /**
   *
   * @param out 左侧输出模块的输出信号
   * @param in  右侧输出模块的输入信号
   * @param update  更新流水线间寄存器
   * @param flush   冲刷流水线间寄存器，此处默认全部复位0
   * @tparam T  流水线间寄存器数据（由Decoupled类型的bits字段组成）
   * @return
   */
  def apply[T <: Data](out: DecoupledIO[T], in: DecoupledIO[T], update: Bool, flush: Bool) = {
    val pipelineRegs = RegInit(0.U.asTypeOf(out.bits))

    in.bits := pipelineRegs
    in.valid := out.valid
    out.ready := in.ready

    when(flush) {
      pipelineRegs := 0.U.asTypeOf(out.bits)
    }.elsewhen(update) {
      pipelineRegs := out.bits
    }
  }
}
